package com.example.smartwaterapi.service;

import com.example.smartwaterapi.entity.User;

import java.util.Map;

/**
 * 微信服务接口
 */
public interface WechatService {

    /**
     * 微信小程序登录
     *
     * @param code 登录code
     * @return 登录结果
     */
    Map<String, Object> login(String code);

    /**
     * 微信小程序登录并绑定手机号
     *
     * @param code 登录code
     * @param encryptedData 加密数据
     * @param iv 加密向量
     * @return 登录结果
     */
    Map<String, Object> loginWithPhone(String code, String encryptedData, String iv);

    /**
     * 更新用户微信信息
     *
     * @param userId 用户ID
     * @param nickname 昵称
     * @param avatar 头像
     * @param gender 性别
     * @return 更新结果
     */
    boolean updateUserInfo(Long userId, String nickname, String avatar, Integer gender);

    /**
     * 绑定微信账号
     *
     * @param userId 用户ID
     * @param code 登录code
     * @return 绑定结果
     */
    boolean bindWechat(Long userId, String code);

    /**
     * 解绑微信账号
     *
     * @param userId 用户ID
     * @return 解绑结果
     */
    boolean unbindWechat(Long userId);

    /**
     * 获取或创建微信用户
     *
     * @param openid 微信openid
     * @param unionid 微信unionid
     * @param sessionKey 微信session_key
     * @return 用户信息
     */
    User getOrCreateWechatUser(String openid, String unionid, String sessionKey);

    /**
     * 通过授权码获取公众号用户信息
     * 
     * @param authCode 网页授权码
     * @return 用户信息
     */
    WechatOfficialUserInfo getOfficialAccountUserInfo(String authCode);

    /**
     * 绑定公众号到用户
     *
     * @param userId 用户ID
     * @param officialAccountOpenid 公众号openid
     * @return 绑定结果
     */
    boolean bindOfficialAccountToUser(Long userId, String officialAccountOpenid);

    /**
     * 公众号用户信息
     */
    class WechatOfficialUserInfo {
        private String openid;
        private String nickname;
        private String headimgurl;
        private String unionid;
        private Integer sex;

        public WechatOfficialUserInfo() {}

        public WechatOfficialUserInfo(String openid, String nickname, String headimgurl, String unionid, Integer sex) {
            this.openid = openid;
            this.nickname = nickname;
            this.headimgurl = headimgurl;
            this.unionid = unionid;
            this.sex = sex;
        }

        // Getters and Setters
        public String getOpenid() { return openid; }
        public void setOpenid(String openid) { this.openid = openid; }
        
        public String getNickname() { return nickname; }
        public void setNickname(String nickname) { this.nickname = nickname; }
        
        public String getHeadimgurl() { return headimgurl; }
        public void setHeadimgurl(String headimgurl) { this.headimgurl = headimgurl; }
        
        public String getUnionid() { return unionid; }
        public void setUnionid(String unionid) { this.unionid = unionid; }
        
        public Integer getSex() { return sex; }
        public void setSex(Integer sex) { this.sex = sex; }
    }
} 